/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package consumo.ejb;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author Carlos Taschetto
 */
public abstract class BasicSessionBean implements java.io.Serializable{
    private static final long serialVersionUID = 2L;

    @PersistenceContext
    private EntityManager em;

    public BasicSessionBean() {
    }

    public EntityManager getEm() {
        return em;
    }


    /**
     *  consulta genérica para todas as entidades
     * @param <T> -
     * @param classToCast - tipo de entidade para consulta
     * @param consulta - consulta sql
     * @param valores - parâmetros da consulta
     * @return Lista de dados da consulta
     */
    public <T> List<T> getList(Class<T> classToCast, String consulta, Object... valores){
        Query qr = createQuery(consulta, valores);
        return qr.getResultList();
    }
    /**
     * @param <T> -
     * @param classToCast - tipo de entidade para consulta
     * @param consulta - consulta sql
     * @param valores - parâmetros da consulta
     * @return Apenas uma entidade (single result)
     */
    public <T> T getPojo(Class<T> classToCast, String consulta, Object... valores){
        Query qr = createQuery(consulta, valores);
        Object obj = qr.getSingleResult();
        System.out.println(obj);
        return (T) obj;
    }

    /**
     * Faz a consulta pela chave primária
     * @param <T>
     * @param classToCast - entidade de classe
     * @param chavePrimaria
     * @return
     */
    public <T> T getPojo(Class<T> classToCast, int chavePrimaria){
        return (T) em.find(classToCast, chavePrimaria);
    }

    public int execute(String consulta, Object... valores){
        Query qr = createQuery(consulta, valores);
        return qr.executeUpdate();
    }

    /**
     *  Método para namedQuery
     * @param <T> -
     * @param classToCast - tipo de entidade para consulta
     * @param consulta - consulta sql
     * @param valores - parâmetros da consulta
     * @return Lista de dados da consulta
     */
    public <T> List<T> getNamedList(Class<T> classToCast, String namedQuery, Object... valores){
        Query qr = em.createNamedQuery(namedQuery);
        if (valores != null) {
            for (int i = 0; i < valores.length; i++) {
                Object object = valores[i];
                qr.setParameter(i + 1, object);
            }
        }
        return qr.getResultList();
    }

    public Query createQuery(String consulta, Object[] valores) {
        Query qr = em.createQuery(consulta);
        if (valores != null) {
            for (int i = 0; i < valores.length; i++) {
                Object object = valores[i];
                qr.setParameter(i + 1, object);
            }
        }
        return qr;
    }

    public void removeEntity(Object T){
        em.remove(em.merge(T));
    }
}
